package springboot.study.project.util.es;

import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @ClassName: ESClient
 * @Description: ES客户端（单例）
 * @Author: baoxia
 * @Date: 2020-07-08 23:26
 * @Version: 1.0
 **/
@Component
public class ESClient {

    /**
     * ES集群名称
     */
    private static String clusterName;
    /**
     * ES服务主机地址
     */
    private static String host;
    /**
     * ES服务主机地址（集群）
     */
    private static String[] hosts;
    /**
     * ES服务端口号
     */
    private static int port;

    @Value("${es.clustername}")
    public void setClusterName(String clusterNameValue) {
        clusterName = clusterNameValue;
    }

    @Value("${es.host}")
    public void setHost(String hostValue) {
        host = hostValue;
    }

    @Value("${es.hosts}")
    public void setHosts(String hostsValue) {
        hosts = hostsValue.replace(" ", "").split(",");
    }

    @Value("${es.port}")
    public void setPort(int portValue) {
        port = portValue;
    }

    // 静态内部类
    private static class Singleton {
        // 创建客户端对象（TransportClient是接口，使用其子类 PreBuiltTransportClient 进行实例化）
        private static TransportClient client = null;

        //  静态代码块
        static {
            // 配置设置对象，指定集群的名称
            Settings settings = Settings.builder().put("cluster.name", clusterName).build();
            try {
                // 创建访问es服务器的客户端实例
                client = new PreBuiltTransportClient(settings);
                // 配置其ES集群节点的IP和端口号（注意使用的TCP协议进行链接的所以使用的9300）
                client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
//                client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hosts[0]), port));
//                client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hosts[1]), port));
//                client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hosts[2]), port));
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取ES客户端
     *
     * @return
     */
    public static TransportClient getInstance() {
        return Singleton.client;
    }


    // 执行测试（注意，单独执行main方法，静态属性的注入是失败的，需要赋予固定的值方可执行）
    public static void main(String[] args) throws UnknownHostException {
        // 配置设置对象，指定集群的名称
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        // 创建访问es服务器的客户端实例
        TransportClient client = new PreBuiltTransportClient(settings);
        // 配置其ES集群节点的IP和端口号（注意使用的TCP协议进行链接的所以使用的9300）
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

        // 执行数据查询
        GetResponse getResponse = client.prepareGet("blog", "hello", "1").get();
        // 打印查询结果
        System.out.println(getResponse.getSourceAsString());
    }
}
